module.exports=async function model_init(DB,Library){

    let Table = await Library.getTable(DB);

  let obj = {};
  for(let a in Table){
      //表名
      let TABLE_NAME = Table[a].table_name;
      //k值
      let TABLE_KEY = Table[a].table_key;
      //生成模型方法
      obj[TABLE_NAME]=()=>{return {
          TABLE_KEY:TABLE_KEY,
          TABLE_NAME:TABLE_NAME,
          //默认查询主键
          find:find,
          //where查询
          where:where,
          //模型的特色方法
          update:update,
          //插入方法
          insert:insert,
          //获取所有数据
          get:async()=>{return await DB.table(TABLE_NAME).get()},
          //调用生命周期
          life:life,
          //提交
          save:save,
      }}
      obj[TABLE_NAME][key]=undefined;
  }
  return obj;

  //模型调用生命周期
  function life(data){
      if(data.end !== undefined){
          let end = data.end;
          data.end = (data)=>{
              if(Array.isArray(data)){
               //是数组
               this[this.TABLE_KEY]=data.map(data=>{
                   return data[this.TABLE_KEY];
               });
              }else if((typeof data) != 'string'){
               //是对象
               this[this.TABLE_KEY] = data[this.TABLE_KEY];
              }
              end();
          }
      }
      return DB.table(this.TABLE_NAME,data)
  }


  //智能提交,进行修改或插入数据,mode=true为插入数据，为false为修改数据，为smart则是智能选择,耗费性能
  async function save(mode='smart'){
      let data = JSON.parse(JSON.stringify(this));
      //获取自身所有元素并删除自己
      delete data.TABLE_KEY;
      delete data.TABLE_NAME;
      //剩下的都是需要的参数了
      //判断需求
      if(mode==='smart'){
          //智能选择，查看是否有key
          if(data[this.TABLE_KEY]!==undefined && await this.find(data[this.TABLE_KEY])){
              console.log('开始修改'+data[this.TABLE_KEY]);
              //此key存在，进行修改data[key]是需要判断的值，data是修改的集合
              let key = data[this.TABLE_KEY];
              delete data[this.TABLE_KEY];
              return (await this.update(key,data)).changedRows;
          }else{
              console.log('没有key开始插入数据');
              //没有key，执行插入操作
              return await this.insert(data);
          }
      }else if(mode===true){
          //插入数据
          return await this.insert(data);
      }else{
          //强制修改数据，有可能是修改全部
          let key = data[this.TABLE_KEY];
          delete data[this.TABLE_KEY];
          return (await this.update(key,data));
      }
  }

  function where(a,b,c){
      let end = (data)=>{
         if(Array.isArray(data)){
          //是数组
          this[this.TABLE_KEY]=data.map(data=>{
              return data[this.TABLE_KEY];
          });
         }else if((typeof data) != 'string'){
          //是对象
          this[this.TABLE_KEY] = data[this.TABLE_KEY];
         }
      }
      return DB.table(this.TABLE_NAME,{end:end}).where(a,b,c);
  }

  //插入数据
  async function insert(data){
      return await DB.table(this.TABLE_NAME).insert(data);
  }

  //默认查询组件
  async function find(id){
      this[this.TABLE_KEY]=id;
      return (await DB.table(this.TABLE_NAME).where(this.TABLE_KEY,id).get())
  }

  //修改数据
  async function update(key,data){
      if(key !== undefined){
          return (await DB.table(this.TABLE_NAME).where(this.TABLE_KEY,key).update(data))
      }else{
          return (await DB.table(this.TABLE_NAME).update(data))
      }
  }


}